package com.amos.knife4j.manager;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.crypto.SecureUtil;
import com.alibaba.fastjson.JSON;
import com.amos.knife4j.config.exception.BusinessException;
import com.amos.knife4j.config.result.ResultEnums;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * redis管理类
 *
 * @author meng_lbo
 * @date 2020/2/27  10:32
 */
@Service
public class RedisManager {

    /**
     * 注入时指定了K、V类型, 必须使用@Resource
     * 使用@Autowired注入指定类型会报错
     */
    @Resource
    private RedisTemplate<String, String> redisTemplate;

    /**
     * 增加redis缓存
     *
     * @param prefix     业务模块前缀
     * @param key        缓存key
     * @param value      缓存值
     * @param expireTime 有效时间（秒）
     * @return
     */

    public boolean set(String prefix, String key, String value, long expireTime) {
        if (expireTime > 0) {
            // 有效时间 >0 设置有效时间
            redisTemplate.opsForValue().set(prefix + key, value, expireTime, TimeUnit.SECONDS);
        } else {
            // 直接存储
            redisTemplate.opsForValue().set(prefix + key, value);
        }
        return true;
    }

    /**
     * 获取缓存
     *
     * @param prefix 业务模块前缀
     * @param key    缓存key
     * @return String 需根据实际格式化
     */

    public String get(String prefix, String key) {
        // 获取String（JSON）类型的value
        return redisTemplate.opsForValue().get(prefix + key);
    }

    public String get(String key) {
        // 获取String（JSON）类型的value
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * 设置过期时间，不设置为永不过期
     *
     * @param prefix     业务模块前缀
     * @param key        缓存key
     * @param expireTime 有效时间（秒）
     * @return
     */
    public boolean expire(String prefix, String key, long expireTime) {
        if (expireTime > 0) {
            // 有效时间 >0 设置
            redisTemplate.expire(prefix + key, expireTime, TimeUnit.SECONDS);
            return true;
        } else {
            // 否则返回false，表示设置失败
            return false;
        }
    }

    /**
     * 删除
     *
     * @param prefix 业务模块前缀
     * @param key    缓存key
     * @return
     */
    public boolean delete(String prefix, String key) {
        // 删除，返回是否删除成功，删除不存在返回false
        Boolean delete = redisTemplate.delete(prefix + key);
        return delete;
    }

    /**
     * 删除全部
     *
     * @param prefix 业务模块前缀
     * @return
     */
    public boolean delete(String prefix) {
        Set<String> keys = redisTemplate.keys(prefix + "*");
        // 删除，返回是否删除成功，删除不存在的返回false
        Long result = redisTemplate.delete(keys);
        return result > 0;
    }

    /**
     * 删除某业务模块下，以keyPrefix开头的所有
     */
    public boolean deleteAll(String prefix, String keyPrefix) {
        Set<String> keys = redisTemplate.keys(prefix + keyPrefix + "*");
        // 删除，返回是否删除成功，删除不存在的返回false
        Long result = redisTemplate.delete(keys);
        return result > 0;
    }

    /**
     * 判断key是否存在
     */
    public boolean hasKey(String prefix, String key) {
        // 是否存在该key
        Boolean hasKey = redisTemplate.hasKey(prefix + key);
        return hasKey;
    }



}
